iT邦幫忙

2022 iThome 鐵人賽

DAY 22
0
Software Development

2022年 JavaScript 相關應用及學習之繁體中文選系列 第 22

[2022年 JavaScript 相關應用及學習之繁體中文選] 函數式程式設計 | 心得導讀

  • 分享至 

  • xImage
  •  

導言

目前流行的範式,大約就是:

  1. 結構化程式設計
  2. 物件導向程式設計
  3. 函數式程式設計

而其中函數式程式設計的要求,就是將所有 feature 以功能的方式區分,切到最小單位的函式。
而目前流行的 serverless 後端解決方案,恰巧就是以函式做為一個設計,想將函數式程式設計寫的更好的開發者,所不能錯過的一本好書。

摘要

3.2 柯里悖論

數理邏輯學家 Haskell Curry40 提出了一個悖論:
如果這句話是對的,那麼中國與德國是鄰國。
那麼這句話到底是不是對的呢?如果這句話是對的,那麼結果就是"中國 與德國是鄰國" 但是這句話本身也是這句話的條件,如果要表示成程式,會是怎樣的呢?
我們先來翻譯"如果……是對的,那麼中國與德國是鄰國,似乎要稍微簡單一些,看樣子一個函數就能輕鬆搞定:

(someStatement)=>{
  if(isTrue)(someStatement)) {
    console.log("中國與德國是鄰國") 
    return true
  }
}

要是沒有異議,那麼完整的"如果這句話是對的,那麼中國與德國是鄰
國、"就變成了:

((someStatement)=>{
  if(isTrue)(someStatement)) {
    console.log("中國與德國是鄰國") 
    return true
  }
})((someStatement)=>{
  if(isTrue)(someStatement)) {
    console.log("中國與德國是鄰國") 
    return true
  }
})

如果你執行一下這段程式,一定會顯示出錯,因為還沒有實現 isTrue函
數。所以,現在的問題是,如何判斷句子是對的呢?當然是只要這個函數
能傳回 true 就說明它是正確的,而且成功地得出"中國與德國是鄰國"的
結論。

let isTrue (statement)=>statement(statement)

代入前面的程式中就獲得了:

((someStatement)=>{
  if(isTrue)(someStatement)) {
    console.log("中國與德國是鄰國") 
    return true
  }
})((someStatement)=>{
  if(isTrue)(someStatement)) {
    console.log("中國與德國是鄰國") 
    return true
  }
})

如果這個函數執行完傳回true,那麼我們就能說"中國與德國是鄰國
了。
但是,執行結果卻是:

RangeError: Maximum call stack size exceeded

現實是殘酷的,讓我們回過頭來看看到底是哪裡出現了問題,導致我們
不到答案。
我們一起來手動執行一下這段程式,首先把參數代入函數中,會獲得:

if(((someStatement)=>{
  if(isTrue)(someStatement)) {
    console.log("中國與德國是鄰國") 
    return true
  }
})((someStatement)=>{
  if(isTrue)(someStatement)) {
    console.log("中國與德國是鄰國") 
    return true
  }
})){
    console.log("中國與德國是鄰國") 
    return true
}

按照應用序,我們可以先忽略if敘述,因為if的條件會先被求值:

 ((statement)=>statement(statement))((statement)=>statement (statement))

總結

難易度

⭐⭐⭐⭐

自備技能

程式撰寫能力

適合對象

中階以上

心得

本書有一定難度,沒有寫個 JS 兩年以上,可能難以理解作者所述。


上一篇
[2022年 JavaScript 相關應用及學習之繁體中文選] Clean Architecture 無瑕的程式碼(架構) | 心得導讀
下一篇
打通 RxJS 任督二脈 | 心得導讀
系列文
2022年 JavaScript 相關應用及學習之繁體中文選31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言